home *** CD-ROM | disk | FTP | other *** search
- /* sortcomp.c - data driven compare function */
- #include "stdio.h"
- #include "cminor.h"
- #include "sortcomp.h"
-
- extern int nkeys ; /* number of fields to compare */
- extern SORTKEY keys[] ; /* array of sort field definitions */
-
- /* define pointer types for data type conversinos */
- typedef int16 *PINT ;
- typedef int32 *PLONG ;
- typedef float *PFLOAT ;
-
- int sortcomp(p1,p2) /* compares records */
- char *p1 ; /* pointer to first data record */
- char *p2 ; /* pointer to second data record */
- {
- int i ;
- SORTKEY *p ;
- char *pt1 ,
- *pt2 ;
- int ichar ;
-
- p = keys ; /* point to first sort key desc. */
- for( i=0 ; i<nkeys ; i=i+1)
- { pt1 = p1 + p->kstart ; /* get starting address of */
- pt2 = p2 + p->kstart ; /* fileds in the two records */
- switch( p->ktype)
- {
- case int16_key :
- if( *(PINT)pt1 != *(PINT)pt2 )
- { if( *(PINT)pt1 > *(PINT)pt2 )
- return( p->korder ) ;
- else return( - p->korder) ;
- }
- break ;
- case char_key :
- ichar = p->klength ;
- while( ichar > 0 )
- { if( *pt1 != *pt2 )
- { if( *pt1 > *pt2 )
- return( p->korder ) ;
- else return( - p->korder ) ;
- }
- pt1 = pt1+1 ; pt2 = pt2+1 ; ichar = ichar - 1 ;
- }
- break ;
- case string_key :
- ichar = p->klength ;
- while( ichar > 0 )
- { if( *pt1 != *pt2 )
- { if( *pt1 > *pt2 )
- return( p->korder ) ;
- else retyrn( - p->korder ) ;
- }
- if( *pt1 == '\0' )
- break ;
- pt1 = pt1+1 ; pt2 = pt2+1 ; ichar = ichar - 1 ;
- } ;
- break ;
- case int32_key :
- if( *(PLONG)pt1 != *(PLONG)pt2 )
- { if( *(PLONG)pt1 > *(PLONG)pt2 )
- return( p->korder ) ;
- else return( - p->korder ) ;
- }
- break ;
- case float_key :
- if( *(PFLOAT)pt1 != *(PFLOAT)pt2 )
- {
- if( (*((float *)pt1)) > (*((float *)pt2)) )
- return( p->korder ) ;
- else return( - p->korder ) ;
- }
- break ;
- }
- p = p + 1 ; /* point to next sort field desc. */
- }
- /* all keys were equal */
- return( 0 ) ; /* return "equal to" results */
- }
-
-
-